package com.example.deepschool.util;

import com.example.deepschool.enums.Permissions;
import lombok.var;
import org.springframework.stereotype.Component;

@Component
public class PermissionsControl {
	
	/**
	 * 获取普通用户的权限值。
	 * 普通用户具有登录/注册、加入课程、评价课程、回答知识点、提问知识点和报告不正确内容的权限。
	 *
	 * @return 普通用户权限的Long值。
	 */
	public static Long RegularPermission ( ) {
		var permissions = 0L;
		permissions = permissions | Permissions.LOGIN_REGISTER.getValue( );
		permissions = permissions | Permissions.JOIN_COURSE.getValue( );
		permissions = permissions | Permissions.RATE_COURSE.getValue( );
		permissions = permissions | Permissions.ANSWER_KNOWLEDGE_POINT.getValue( );
		permissions = permissions | Permissions.ASK_KNOWLEDGE_POINT.getValue( );
		permissions = permissions | Permissions.REPORT_INCORRECT_CONTENT.getValue( );
		return permissions;
	}
	
	/**
	 * 设置课程管理员的权限值。
	 * 课程管理员除了具有普通用户的权限外，还可以发布课程、修改自己的课程。
	 *
	 * @return 课程管理员权限的Long值，
	 */
	public static Long CourseMasterPermission ( ) {
		var permissions = 0L;
		permissions = permissions | Permissions.LOGIN_REGISTER.getValue( );
		permissions = permissions | Permissions.JOIN_COURSE.getValue( );
		permissions = permissions | Permissions.PUBLISH_COURSE.getValue( );
		permissions = permissions | Permissions.MODIFY_OWN_COURSE.getValue( );
		permissions = permissions | Permissions.RATE_COURSE.getValue( );
		permissions = permissions | Permissions.ANSWER_KNOWLEDGE_POINT.getValue( );
		permissions = permissions | Permissions.ASK_KNOWLEDGE_POINT.getValue( );
		permissions = permissions | Permissions.REPORT_INCORRECT_CONTENT.getValue( );
		return permissions;
	}
	
	/**
	 * 设置管理员的权限值。
	 * 管理员具有所有权限。
	 *
	 * @return 管理员权限的Long值。
	 */
	public static Long AdminPermission ( ) {
		var permissions = 0L;
		for ( Permissions permission : Permissions.values( ) ) {
			permissions = permissions | permission.getValue( );
		}
		return permissions;
	}
	
	/**
	 * 验证用户是否具有登录/注册权限。
	 *
	 * @param permissions 用户的权限集合。
	 * @return 如果用户具有登录/注册权限，则返回true；否则返回false。
	 */
	public static boolean VERIFY_LOGIN_REGISTER ( Long permissions ) {
		return ( permissions & Permissions.LOGIN_REGISTER.getValue( ) ) > 0;
	}
	
	/**
	 * 验证用户是否具有加入课程的权限。
	 *
	 * @param permissions 用户的权限集合。
	 * @return 如果用户具有加入课程的权限，则返回true；否则返回false。
	 */
	public static boolean VERIFY_JOIN_COURSE ( Long permissions ) {
		return ( permissions & Permissions.JOIN_COURSE.getValue( ) ) > 0;
	}
	
	/**
	 * 验证用户是否具有发布课程的权限。
	 *
	 * @param permissions 用户的权限集合。
	 * @return 如果用户具有发布课程的权限，则返回true；否则返回false。
	 */
	public static boolean VERIFY_PUBLISH_COURSE ( Long permissions ) {
		return ( permissions & Permissions.PUBLISH_COURSE.getValue( ) ) > 0;
	}
	
	/**
	 * 验证用户是否具有修改自己课程的权限。
	 *
	 * @param permissions 用户的权限集合。
	 * @return 如果用户具有修改自己课程的权限，则返回true；否则返回false。
	 */
	public static boolean VERIFY_MODIFY_OWN_COURSE ( Long permissions ) {
		return ( permissions & Permissions.MODIFY_OWN_COURSE.getValue( ) ) > 0;
	}
	
	/**
	 * 验证用户是否具有评价课程的权限。
	 *
	 * @param permissions 用户的权限集合。
	 * @return 如果用户具有评价课程的权限，则返回true；否则返回false。
	 */
	public static boolean VERIFY_RATE_COURSE ( Long permissions ) {
		return ( permissions & Permissions.RATE_COURSE.getValue( ) ) > 0;
	}
	
	/**
	 * 验证用户是否具有回答知识点的权限。
	 *
	 * @param permissions 用户的权限集合。
	 * @return 如果用户具有回答知识点的权限，则返回true；否则返回false。
	 */
	public static boolean VERIFY_ANSWER_KNOWLEDGE_POINT ( Long permissions ) {
		return ( permissions & Permissions.ANSWER_KNOWLEDGE_POINT.getValue( ) ) > 0;
	}
	
	/**
	 * 验证用户是否具有提问知识点的权限。
	 *
	 * @param permissions 用户的权限集合。
	 * @return 如果用户具有提问知识点的权限，则返回true；否则返回false。
	 */
	public static boolean VERIFY_ASK_KNOWLEDGE_POINT ( Long permissions ) {
		return ( permissions & Permissions.ASK_KNOWLEDGE_POINT.getValue( ) ) > 0;
	}
	
	/**
	 * 验证用户是否具有报告不正确内容的权限。
	 *
	 * @param permissions 用户的权限集合。
	 * @return 如果用户具有报告不正确内容的权限，则返回true；否则返回false。
	 */
	public static boolean VERIFY_REPORT_INCORRECT_CONTENT ( Long permissions ) {
		return ( permissions & Permissions.REPORT_INCORRECT_CONTENT.getValue( ) ) > 0;
	}
	
	/**
	 * 验证用户是否具有审核课程信息的权限。
	 *
	 * @param permissions 用户的权限集合。
	 * @return 如果用户具有审核课程信息的权限，则返回true；否则返回false。
	 */
	public static boolean VERIFY_COURSE_INFO_REVIEW ( Long permissions ) {
		return ( permissions & Permissions.COURSE_INFO_REVIEW.getValue( ) ) > 0;
	}

	/**
	 * 验证用户是否为后台管理员
	 *
	 * @param permissions 用户的权限集合。
	 * @return 如果用户具有审核课程信息的权限，则返回true；否则返回false。
	 */
	public static boolean VERIFY_IS_ADMIN(Long permissions){
		for(Permissions permissions1 : Permissions.values()){
			if((permissions & permissions1.getValue())==0){
				return false;
			}
		}
		return true;
	}
	
	/**
	 * 验证用户是否具有处理违规行为的权限。
	 *
	 * @param permissions 用户的权限集合。
	 * @return 如果用户具有处理违规行为的权限，则返回true；否则返回false。
	 */
	public static boolean VERIFY_HANDLE_RULE_VIOLATION ( Long permissions ) {
		return ( permissions & Permissions.HANDLE_RULE_VIOLATION.getValue( ) ) > 0;
	}
	
	/**
	 * 切换用户的登录/注册权限。
	 *
	 * @param permissions 用户的权限集合。
	 *                    使用按位异或操作来改变指定权限的状态，如果当前有此权限则移除，没有则赋予。
	 * @return 返回切换登录/注册权限后的用户权限集合。
	 */
	public static Long REVERSED_LOGIN_REGISTER ( Long permissions ) {
		return permissions ^ Permissions.LOGIN_REGISTER.getValue( );
	}
	
	/**
	 * 切换用户的加入课程权限。
	 *
	 * @param permissions 用户的权限集合。
	 *                    使用按位异或操作来改变指定权限的状态，如果当前有此权限则移除，没有则赋予。
	 * @return 返回切换加入课程权限后的用户权限集合。
	 */
	public static Long REVERSED_JOIN_COURSE ( Long permissions ) {
		return permissions ^ Permissions.JOIN_COURSE.getValue( );
	}
	
	/**
	 * 切换用户的发布课程权限。
	 *
	 * @param permissions 用户的权限集合。
	 *                    使用按位异或操作来改变指定权限的状态，如果当前有此权限则移除，没有则赋予。
	 * @return 返回切换发布课程权限后的用户权限集合
	 */
	public static Long REVERSED_PUBLISH_COURSE ( Long permissions ) {
		return permissions ^ Permissions.PUBLISH_COURSE.getValue( );
	}
	
	/**
	 * 切换用户的修改自己课程权限。
	 *
	 * @param permissions 用户的权限集合。
	 *                    使用按位异或操作来改变指定权限的状态，如果当前有此权限则移除，没有则赋予。
	 * @return 返回切换修改自己课程权限后的用户权限集合。
	 */
	public static Long REVERSED_MODIFY_OWN_COURSE ( Long permissions ) {
		return permissions ^ Permissions.MODIFY_OWN_COURSE.getValue( );
	}
	
	/**
	 * 切换用户的评价课程权限。
	 *
	 * @param permissions 用户的权限集合。
	 *                    使用按位异或操作来改变指定权限的状态，如果当前有此权限则移除，没有则赋予。
	 * @return 返回切换评价课程权限后的用户权限集合。
	 */
	public static Long REVERSED_RATE_COURSE ( Long permissions ) {
		return permissions ^ Permissions.RATE_COURSE.getValue( );
	}
	
	/**
	 * 切换用户的回答知识点权限。
	 *
	 * @param permissions 用户的权限集合。
	 *                    使用按位异或操作来改变指定权限的状态，如果当前有此权限则移除，没有则赋予。
	 * @return 返回切换回答知识点权限后的用户权限集合。
	 */
	public static Long REVERSED_ANSWER_KNOWLEDGE_POINT ( Long permissions ) {
		return permissions ^ Permissions.ANSWER_KNOWLEDGE_POINT.getValue( );
	}
	
	/**
	 * 切换用户的提问知识点权限。
	 *
	 * @param permissions 用户的权限集合。
	 *                    使用按位异或操作来改变指定权限的状态，如果当前有此权限则移除，没有则赋予。
	 * @return 返回切换提问知识点权限后的用户权限集合。
	 */
	public static Long REVERSED_ASK_KNOWLEDGE_POINT ( Long permissions ) {
		return permissions ^ Permissions.ASK_KNOWLEDGE_POINT.getValue( );
	}
	
	/**
	 * 切换用户的报告不正确内容权限。
	 *
	 * @param permissions 用户的权限集合。
	 *                    使用按位异或操作来改变指定权限的状态，如果当前有此权限则移除，没有则赋予。
	 * @return 返回切换报告不正确内容权限后的用户权限集合。
	 */
	public static Long REVERSED_REPORT_INCORRECT_CONTENT ( Long permissions ) {
		return permissions ^ Permissions.REPORT_INCORRECT_CONTENT.getValue( );
	}
	
	/**
	 * 切换用户的审核课程信息权限。
	 *
	 * @param permissions 用户的权限集合。
	 *                    使用按位异或操作来改变指定权限的状态，如果当前有此权限则移除，没有则赋予。
	 * @return 返回切换审核课程信息权限后的用户权限集合。
	 */
	public static Long REVERSED_COURSE_INFO_REVIEW ( Long permissions ) {
		return permissions ^ Permissions.COURSE_INFO_REVIEW.getValue( );
	}
	
	/**
	 * 切换用户的处理违规行为权限。
	 *
	 * @param permissions 用户的权限集合。
	 *                    使用按位异或操作来改变指定权限的状态，如果当前有此权限则移除，没有则赋予。
	 * @return 返回切换处理违规行为权限后的用户权限集合。
	 */
	public static Long REVERSED_HANDLE_RULE_VIOLATION ( Long permissions ) {
		return permissions ^ Permissions.HANDLE_RULE_VIOLATION.getValue( );
	}
}
